package com.feri.fitness.us.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.feri.fitness.common.config.RocketMQConfig;
import com.feri.fitness.common.dto.MqLevelMsg;
import com.feri.fitness.common.vo.R;
import com.feri.fitness.us.dao.UserFollowDao;
import com.feri.fitness.us.dao.UserLevelDao;
import com.feri.fitness.us.dao.UserMessageDao;
import com.feri.fitness.us.domain.UserFollow;
import com.feri.fitness.us.domain.UserLevel;
import com.feri.fitness.us.domain.UserMessage;
import com.feri.fitness.us.service.intf.UserFollowService;
import com.feri.fitness.us.type.MessageType;
import com.feri.fitness.us.util.RocketMqUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 邢朋辉
 * @Date: 2023/1/9 11:06
 */
@Service
public class UserFollowServiceImpl implements UserFollowService {
    @Resource
    private UserFollowDao dao;

    @Override
    public R add(int uid, int fuid) {
        //1.验证
        if(fuid>0 && uid!=fuid){
            //2.查询 是否关注过
            QueryWrapper<UserFollow> wrapper=new QueryWrapper<>();
            wrapper.eq("uid",uid).eq("fuid",fuid);
            UserFollow follow=dao.selectOne(wrapper);
            //3.验证状态
            if(follow!=null){
                //4.验证当前是关注还是取消关注
                if(follow.getFlag()==1){
                    //当前已经是关注状态了，这一次不能再关注了
                    return R.fail();
                }else {
                    //5.当前的状态是取消关注，本次可以关注
                    follow.setFlag(1);
                    if(dao.updateById(follow)>0){
                        //返回结果
                        return R.ok();
                    }
                }
            }else {
                //6.第一次关注，直接新增
                follow=new UserFollow();
                follow.init(uid, fuid);
                if(dao.insert(follow)>0){
                    //新增粉丝 只有第一次成为别人的粉丝，给别人要给予成长值
                    //8.给予成长值（根据套餐的金额 10倍成长值奖励）-MQ
                    //1.高并发为前提 2.好处：1.异步 发送和处理异步 提高效率 2.解耦 方便扩展 3.降低冗余度，提高复用，凡是出现成长值变化的地方，只需要发个MQ消息
                    //3.使用 RocketMQ,通过主题Topic(内部有队列),普通消息 消息内容：json格式
                    RocketMqUtil.send(RocketMQConfig.MQ_GROW, JSON.toJSONString(
                            new MqLevelMsg(fuid,2,"恭喜你，新增粉丝1枚，奖励2个成长值")));
                    //关注成功
                    return R.ok();
                }
            }
        }
        return R.fail("亲，网络故障，请检查！");
    }

    @Override
    public R del(int id) {
        //1.验证
        if(id>0){
            //2.直接更改
            UserFollow follow=new UserFollow();
            follow.setFlag(2);
            follow.setId(id);
            if(dao.updateById(follow)>0){

                return R.ok();
            }
        }
        return R.fail();
    }

    @Override
    public R queryFollows(int uid) {
        //1.查询 这里目前没有改为多表联合，自己需要细化
        QueryWrapper<UserFollow> wrapper=new QueryWrapper<>();
        wrapper.eq("uid",uid);
        wrapper.eq("flag",1);
        wrapper.orderByDesc("ctime");
        return R.ok(dao.selectList(wrapper));
    }

    @Override
    public R queryFans(int uid) {
        //1.查询 这里目前没有改为多表联合，自己需要细化
        QueryWrapper<UserFollow> wrapper=new QueryWrapper<>();
        wrapper.eq("fuid",uid);
        wrapper.eq("flag",1);
        wrapper.orderByDesc("ctime");
        return R.ok(dao.selectList(wrapper));
    }
}
